package com.lsk.common;

import cn.dreampie.quartz.QuartzPlugin;
import com.alibaba.druid.filter.logging.Log4jFilter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.config.*;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.template.Engine;
import com.lsk.common.interceptor.CacheInterceptor;
import com.lsk.common.interceptor.ExceptionInterceptor;
import com.lsk.handler.DruidStatViewHandlerRewrite;
import com.lsk.index.IndexController;
import com.lsk.moduleRoute.*;
import com.lsk.task.*;
import com.lsk.util.GlobalParameter;
import com.lsk.util.Syslog;

/**
 * 本 lsk 仅表达最为粗浅的 jfinal 用法，更为有价值的实用的企业级用法
 * 详见 JFinal 俱乐部: http://jfinal.com/club
 * 
 * API引导式配置
 */
public class Config extends JFinalConfig {
	
	/**
	 * 运行此 main 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 * 
	 * 使用本方法启动过第一次以后，会在开发工具的 debug、run config 中自动生成
	 * 一条启动配置，可对该自动生成的配置再添加额外的配置项，例如 VM argument 可配置为：
	 * -XX:PermSize=64M -XX:MaxPermSize=256M
	 */
	public static void main(String[] args) {
		/**
		 * 特别注意：Eclipse 之下建议的启动方式
		 */
		//JFinal.start("src/main/webapp", 80, "/", 5);
		
		/**
		 * 特别注意：IDEA 之下建议的启动方式，仅比 eclipse 之下少了最后一个参数
		 */
		//JFinal.start("src/main/webapp", 80, "/");
	}
	
	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		Prop config = PropKit.use("config.properties");
		String activeConfig = PropKit.get("profiles.active");
		if(!StrKit.isBlank(activeConfig)){
			config.appendIfExists("config_" + activeConfig + ".properties");
		}
		//PropKit.use("a_little_config.txt");
		me.setDevMode(PropKit.getBoolean("devMode", true));
		me.setViewType(ViewType.JSP);//设置为Jsp
		me.setError404View("/common/404.html");
		me.setError500View("/common/500.html");
	}
	public void afterJFinalStart() {

		//RunAfter runAfter=new RunAfter();//将配置信息放入

		if (GlobalParameter.windows){//开发环境
			//RefreshWxToken refreshWxToken=new RefreshWxToken();
			Syslog.info("windows系统，开发环境，跳过自启动");
		}else{
			//Syslog.info("生产环境");
			//RefreshWxToken refreshWxToken=new RefreshWxToken();
			//RefreshWxaToken refreshWxaToken=new RefreshWxaToken();
			//OssStsTask ossStsTask=new OssStsTask();
			//ossStsTask.run();
		}

	}
	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add("/",IndexController.class,"admin");
		me.add(new AdminRoute());//后台路由
		me.add(new MobileRoute());//移动端路由


	}
	
	public void configEngine(Engine me) {
		me.addSharedFunction("/common/_layout.html");
		me.addSharedFunction("/common/_paginate.html");
	}
	
	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置 druid 数据库连接池插件
		DruidPlugin druidPlugin = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
		/*防止sql注入*/
		WallFilter wallFilter=new WallFilter();
		druidPlugin.addFilter(wallFilter);
		/*sql统计*/
		StatFilter statFilter=new StatFilter();
		statFilter.setMergeSql(true);
		statFilter.setSlowSqlMillis(10000);
		druidPlugin.addFilter(statFilter);


		// 配置ActiveRecord插件
		//打印超时的链接
		druidPlugin.setLogAbandoned(true);
		//自动回收超时连接
		druidPlugin.setRemoveAbandoned(true);
		//超时时间(以秒数为单位)
		druidPlugin.setRemoveAbandonedTimeoutMillis(10);

		/*log4j日志输出*/
		Log4jFilter logFilter = new Log4jFilter();
		logFilter.setStatementLogEnabled(false);
		logFilter.setStatementLogErrorEnabled(true);
		logFilter.setStatementExecutableSqlLogEnable(true);

		druidPlugin.addFilter(logFilter);

		wallFilter.setDbType("mysql");
		me.add(druidPlugin);
		/*配置Redis*/
		RedisPlugin redisPlugin=new RedisPlugin(PropKit.get("cache.name"), PropKit.get("redis.host"),6379, 30, PropKit.get("redis.password"), Integer.parseInt(PropKit.get("redis.database")));
		me.add(redisPlugin);

		EhCachePlugin ecp = new EhCachePlugin();
		me.add(ecp);

		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		// 所有映射在 MappingKit 中自动化搞定
		arp.setShowSql(true);//打印Sql
		me.add(arp);

		/*定时刷新token  每小时的30时间刷新*/
		Cron4jPlugin cron4jPlugin = new Cron4jPlugin();
		cron4jPlugin.addTask("30 * * * *", new RefreshWxTokenThread());//一小时执行一次
		cron4jPlugin.addTask("30 10 * * *",new WithdrawTask());
		cron4jPlugin.addTask("30 8 * * *",new AgentTask());


		/*刷新闲卡网数据  凌晨3点启动刷新*/
		//cron4jPlugin.addTask("* 3 * * *", new RefreshXkData());//一小时执行一次

		//30秒分钟调 推送信息
		//cron4jPlugin.addTask("*/30 * * * * ?", new SendCardTask());

		me.add(cron4jPlugin);

		QuartzPlugin quartzPlugin=new QuartzPlugin();
		quartzPlugin.setJobs("quartzJob.properties");
		me.add(quartzPlugin);
	}
	
	public static DruidPlugin createDruidPlugin() {
		return new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
	}
	
	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		me.add(new ExceptionInterceptor());//捕捉异常
		me.add(new CacheInterceptor());//禁止缓存
	}
	
	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		DruidStatViewHandlerRewrite dsvh = new DruidStatViewHandlerRewrite("druid");
		me.add(dsvh);
	}
}
